package com.zjsru.plan2024.oneday;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: cookLee
 * @Date: 2024-01-08
 * 回旋镖的数量
 * 给定平面上 n 对 互不相同 的点 points ，其中 points[i] = [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 ，其中 i 和 j 之间的距离和 i 和 k 之间的欧式距离相等（需要考虑元组的顺序）。
 */
public class NumberOfBoomerangs {
    /**
     * 主
     * \
     * 输入：points = [[0,0],[1,0],[2,0]]
     * 输出：2
     * 解释：两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]
     * \
     * @param args args
     */
    public static void main(String[] args) {
        NumberOfBoomerangs numberOfBoomerangs = new NumberOfBoomerangs();
        int[][] points = new int[][]{{0,0},{1,0},{2,0}};
        System.out.println(numberOfBoomerangs.numberOfBoomerangs(points));
    }

    /**
     * 回旋镖数量
     *
     * @param points 点数
     * @return int
     */
    public int numberOfBoomerangs(int[][] points) {
        int ans = 0;
        for (int[] point : points) {
            //key是两个点之间的平方距离，value是该距离出现的次数。
            Map<Integer, Integer> cnt = new HashMap<>();
            // //计算当前点与所有其他点之间的距离
            for (int[] p : points) {
                int diff = (point[0] - p[0]) * (point[0] - p[0]) + (point[1] - p[1]) * (point[1] - p[1]);
                cnt.put(diff, cnt.getOrDefault(diff, 0) + 1);
            }
            for (Map.Entry<Integer, Integer> entry : cnt.entrySet()) {
                int value = entry.getValue();
                //回旋镖的数量是选择第一个和第二个点的可能性乘以选择第三个点的可能性,
                //选择第一个和第二个点有 value 种可能性，因为有 value 个点，我们可以选择任意两个。然后，选择第三个点只能是剩下的 value - 1 个点
                ans += value * (value - 1);
            }
        }
        return ans;
    }

}
